Image processing and neural networks are both paramount to machine learning. This markdown is a mere compilation of useful examples from the EBImage, imager, and mxnet R packages. The goal is to provide a summary of basic concepts of how images can be processed and submitted to a convolutional neural network in R.

Much of this code is borrowed directly from the below examples. Read the original documentation to learn much more:
- EBImage
- imager
- mxnet

Todo:
- Results are probably incorrect.
- AUC plotting does not work.

1. Install required packages

For this example: EBImage, mxnet, ggplot2, imager, jpeg, pROC

# EBImage
source("https://bioconductor.org/biocLite.R")
biocLite("EBImage")

# mxnet
cran = getOption("repos")
cran["dmlc"] = "https://apache-mxnet.s3-accelerate.dualstack.amazonaws.com/R/CRAN/" 
  # https://github.com/dmlc
  # https://github.com/dmlc/drat
options(repos = cran)
install.packages("mxnet")
library(mxnet)

# ggplot2, imager, jpeg, pROC
install.packages(c("ggplot2", "imager", "jpeg", "pROC"))

Library

library(EBImage)
library(mxnet)
library(ggplot2)
library(imager)
## Loading required package: plyr
## Loading required package: magrittr
## 
## Attaching package: 'imager'
## The following object is masked from 'package:magrittr':
## 
##     add
## The following object is masked from 'package:plyr':
## 
##     liply
## The following objects are masked from 'package:EBImage':
## 
##     channel, dilate, display, erode, resize, watershed
## The following objects are masked from 'package:stats':
## 
##     convolve, spectrum
## The following object is masked from 'package:graphics':
## 
##     frame
## The following object is masked from 'package:base':
## 
##     save.image
library(jpeg)
library(pROC)
## Type 'citation("pROC")' for a citation.
## 
## Attaching package: 'pROC'
## The following object is masked from 'package:imager':
## 
##     ci
## The following objects are masked from 'package:stats':
## 
##     cov, smooth, var

Be sure to also check out:

# h2o - https://www.h2o.ai/
install.packages("h2o")
library(h2o)

# keras - https://keras.rstudio.com/
install.packages("keras")
library(keras)
# install_keras(method = "conda")
install_keras()

# tensorflow - https://tensorflow.rstudio.com/tensorflow/articles/installation.html
install.packages("tensorflow")
library(tensorflow)
install_tensorflow()

2. Load and edit a single free image of koi fish.

koi_fish_EB = EBImage::readImage("/Users/evan.muzzall/Desktop/MachineLearningWG/Fall2017/Sep22-images-cnn/images-cnn-R/image_001.jpg") # load fullsize color image
class(koi_fish_EB)
## [1] "Image"
## attr(,"package")
## [1] "EBImage"
koi_fish_EB
## Image 
##   colorMode    : Color 
##   storage.mode : double 
##   dim          : 1125 750 3 
##   frames.total : 3 
##   frames.render: 1 
## 
## imageData(object)[1:5,1:6,1]
##           [,1]      [,2]      [,3]      [,4]      [,5]      [,6]
## [1,] 0.1529412 0.1529412 0.1529412 0.1529412 0.1607843 0.1647059
## [2,] 0.1529412 0.1529412 0.1529412 0.1529412 0.1607843 0.1686275
## [3,] 0.1568627 0.1529412 0.1529412 0.1568627 0.1607843 0.1686275
## [4,] 0.1568627 0.1568627 0.1568627 0.1568627 0.1607843 0.1686275
## [5,] 0.1568627 0.1568627 0.1568627 0.1607843 0.1647059 0.1725490
par(mfrow=c(1,2)); plot(koi_fish_EB)
# imageData(koi_fish_EB)

koi_fish = imager::load.image("/Users/evan.muzzall/Desktop/MachineLearningWG/Fall2017/Sep22-images-cnn/images-cnn-R/image_001.jpg") # same image 
class(koi_fish) # different class? # http://www.cimg.eu/
## [1] "cimg"         "imager_array" "numeric"
koi_fish
## Image. Width: 1125 pix Height: 750 pix Depth: 1 Colour channels: 3
plot(koi_fish)

# as.array(koi_fish)

# shorter names
koiEB = koi_fish_EB
koi = koi_fish

3. EBImage

3.1 get basic info

plot(koiEB)

plot(max(koiEB) - koiEB) # do math stuff! (see below)

par(mfrow=c(1,1)); hist(koiEB, lwd = 2) # RGB intensity

# View image data
attributes(koiEB)
## $dim
## [1] 1125  750    3
## 
## $colormode
## [1] 2
## 
## $class
## [1] "Image"
## attr(,"package")
## [1] "EBImage"
attributes(koi)
## $class
## [1] "cimg"         "imager_array" "numeric"     
## 
## $dim
## [1] 1125  750    1    3

3.2 fast manipulations

# + / - brightness
koiEB1 = koiEB + 0.5
koiEB2 = koiEB - 0.5
par(mfrow=c(1,2)); plot(koiEB1); plot(koiEB2)

# * contrast
koiEB3 = koiEB * 0.25
koiEB4 = koiEB * 5
plot(koiEB3); plot(koiEB4)

# ^ gamma correction
koiEB5 = koiEB ^ 10
koiEB6 = koiEB ^ 0.75
plot(koiEB5); plot(koiEB6)

# flip, rotate, translate, rotate/translate
koiEB7 = flip(koiEB)
koiEB8 = rotate(koiEB, 45)
koiEB9 = translate(koiEB, c(500, 0))
koiEB10 = translate(rotate(koiEB, 45), c(0, 500))
par(mfrow=c(1,4)); plot(koiEB7); plot(koiEB8); plot(koiEB9); plot(koiEB10)

# grayscale frames 
koiEB9 = koiEB
koiEB9 # frames.render
## Image 
##   colorMode    : Color 
##   storage.mode : double 
##   dim          : 1125 750 3 
##   frames.total : 3 
##   frames.render: 1 
## 
## imageData(object)[1:5,1:6,1]
##           [,1]      [,2]      [,3]      [,4]      [,5]      [,6]
## [1,] 0.1529412 0.1529412 0.1529412 0.1529412 0.1607843 0.1647059
## [2,] 0.1529412 0.1529412 0.1529412 0.1529412 0.1607843 0.1686275
## [3,] 0.1568627 0.1529412 0.1529412 0.1568627 0.1607843 0.1686275
## [4,] 0.1568627 0.1568627 0.1568627 0.1568627 0.1607843 0.1686275
## [5,] 0.1568627 0.1568627 0.1568627 0.1607843 0.1647059 0.1725490
colorMode(koiEB9) = Grayscale
par(mfrow=c(1,1)); plot(koiEB9)
## Only the first frame of the image stack is displayed.
## To display all frames use 'all = TRUE'.

plot(koiEB9, all = T)

attributes(koiEB9)
## $dim
## [1] 1125  750    3
## 
## $colormode
## [1] 0
## 
## $class
## [1] "Image"
## attr(,"package")
## [1] "EBImage"
# imageData(koiEB9)

4. imager

# load a URL! 
cartoon = load.image("https://carboncostume.com/wordpress/wp-content/uploads/2013/04/Calvin-and-Hobbes.jpg")
plot(cartoon)

# basic info
plot(koi) # coordinates appear, etc. 

# what is noise?
# set.seed(1)
noise = array(runif(5*5*5*3),c(5,5,5,3)) #5x5 pixels, 5 frames, 3 colors. All noise

# the color channel comma cascade:
noise[,,,1] # multiple frames of a single color channel
## , , 1
## 
##           [,1]       [,2]      [,3]      [,4]        [,5]
## [1,] 0.2165910 0.85889431 0.2240415 0.7237455 0.767017245
## [2,] 0.9215360 0.02692531 0.4245499 0.8041211 0.002477831
## [3,] 0.5887304 0.10981007 0.2322821 0.6619224 0.324283957
## [4,] 0.9626456 0.76354879 0.7620077 0.6070075 0.064626638
## [5,] 0.3051101 0.71781823 0.6590851 0.9508119 0.101266850
## 
## , , 2
## 
##           [,1]        [,2]       [,3]      [,4]       [,5]
## [1,] 0.3189171 0.829259446 0.80514918 0.7014689 0.38667938
## [2,] 0.4093652 0.663645647 0.71834546 0.8749299 0.08146706
## [3,] 0.0580800 0.153778796 0.08967635 0.7836172 0.90929827
## [4,] 0.7388966 0.006742221 0.35972259 0.1109142 0.51370162
## [5,] 0.1285854 0.761996568 0.41454907 0.3358010 0.61736717
## 
## , , 3
## 
##           [,1]      [,2]       [,3]      [,4]      [,5]
## [1,] 0.8064842 0.8034030 0.02090191 0.7589014 0.8948724
## [2,] 0.9078531 0.6751232 0.06767809 0.6301260 0.8966232
## [3,] 0.1681389 0.4715458 0.04656787 0.5504228 0.9703717
## [4,] 0.9912175 0.8228543 0.27457053 0.9113761 0.9895897
## [5,] 0.8373412 0.8592794 0.16056178 0.7947528 0.8960424
## 
## , , 4
## 
##            [,1]      [,2]      [,3]      [,4]      [,5]
## [1,] 0.31967646 0.7047837 0.2598595 0.3533917 0.5499076
## [2,] 0.03188947 0.9304651 0.7236470 0.7845687 0.1072325
## [3,] 0.04860569 0.5032494 0.9638024 0.5542222 0.7982115
## [4,] 0.60519629 0.9748419 0.9019760 0.2937625 0.7591349
## [5,] 0.21336310 0.7685153 0.9613006 0.3182348 0.9240564
## 
## , , 5
## 
##            [,1]       [,2]       [,3]       [,4]      [,5]
## [1,] 0.31890823 0.44810948 0.19630789 0.29912270 0.2571750
## [2,] 0.11561988 0.13965752 0.09278179 0.02128383 0.2180275
## [3,] 0.68747128 0.06259736 0.62436189 0.63895742 0.4941538
## [4,] 0.45391557 0.35066930 0.29655748 0.22310572 0.6580405
## [5,] 0.09872768 0.84362016 0.01020359 0.83568592 0.1909827
noise[,,1,1] # single frame
##           [,1]       [,2]      [,3]      [,4]        [,5]
## [1,] 0.2165910 0.85889431 0.2240415 0.7237455 0.767017245
## [2,] 0.9215360 0.02692531 0.4245499 0.8041211 0.002477831
## [3,] 0.5887304 0.10981007 0.2322821 0.6619224 0.324283957
## [4,] 0.9626456 0.76354879 0.7620077 0.6070075 0.064626638
## [5,] 0.3051101 0.71781823 0.6590851 0.9508119 0.101266850
noise[,1,1,1] # col
## [1] 0.2165910 0.9215360 0.5887304 0.9626456 0.3051101
noise[1,,1,1] # row
## [1] 0.2165910 0.8588943 0.2240415 0.7237455 0.7670172
noise = as.cimg(noise) # convert it back to handy cimg format
plot(noise) #, frame = 2)
## Warning in plot.cimg(noise): Showing first frame

# make a grayscale copy
koi_g = grayscale(koi)
plot(koi_g)

4.2 convert to data frame and ggplot2

# convert to data frame
koi_df = as.data.frame(koi)
head(koi_df) # aha! we have an xy coordinate, color channel, and pixel value
##   x y cc     value
## 1 1 1  1 0.1529412
## 2 2 1  1 0.1529412
## 3 3 1  1 0.1568627
## 4 4 1  1 0.1568627
## 5 5 1  1 0.1568627
## 6 6 1  1 0.1607843
koi_df = plyr::mutate(koi_df, channel = factor(cc, labels=c("Red","Green", "Blue")))
head(koi_df) # relabel color channel
##   x y cc     value channel
## 1 1 1  1 0.1529412     Red
## 2 2 1  1 0.1529412     Red
## 3 3 1  1 0.1568627     Red
## 4 4 1  1 0.1568627     Red
## 5 5 1  1 0.1568627     Red
## 6 6 1  1 0.1607843     Red
# Look at rgb channels of the color image
ggplot(koi_df, aes(value, fill = channel)) + 
  geom_histogram(bins=30) + 
  facet_wrap(~ channel) + 
  theme_minimal() + 
  guides(fill = F)

# gradients
gr = imgradient(koi_g,"xy")
gr
## Image list of size 2
plot(gr)

4.3 pixsets for quick binary image highlighting

# pixsets
pix = koi_g > .6 # Select pixels with high luminance
pix
## Pixel set of size 80688. Width: 1125 pix Height: 750 pix Depth: 1 Colour channels: 1
plot(pix)

# highlight contours using pixel sets
pix = (isoblur(koi_g, 4)  > .5 )
highlight(pix)

# highlight certain areas
plot(koi_g)
# Start the fill at location (900,400). sigma sets the tolerance
px.flood(koi_g,900, 400,sigma=.35) %>% highlight

# or, just plot boundaries
plot(boundary(pix))

# basic morphological image processing - https://www.cs.auckland.ac.nz/courses/compsci773s1c/lectures/ImageProcessing-html/topic4.htm
plot(koi)
highlight(pix)

#Grow by 5 pixels
grow(pix,5) %>% highlight(col="green", lwd = 3)
#Shrink by 5 pixels
shrink(pix,5) %>% highlight(col="blue", lwd = 3)

5. mxnet

#Below is a replication of Taweh Beysolow II / gwens CNN instructions: 
#https://github.com/Apress/intro-to-deep-learning-using-r

#Downloading the strings of the image files in each directory
fish_photos = list.files("/Users/evan.muzzall/Desktop/MachineLearningWG/Fall2017/Sep22-images-cnn/images-cnn-R")
fish_photos
##  [1] "image_001.jpg" "image_002.jpg" "image_003.jpg" "image_004.jpg"
##  [5] "image_005.jpg" "image_006.jpg" "image_007.jpg" "image_008.jpg"
##  [9] "image_009.jpg" "image_010.jpg" "image_011.jpg" "image_012.jpg"
## [13] "image_013.jpg" "image_014.jpg" "image_015.jpg" "image_016.jpg"
## [17] "image_017.jpg" "image_018.jpg" "image_019.jpg" "image_020.jpg"
#Preprocessing
#Downloading the image data 
img_data = data.frame()

#Turning Photos into Bitmaps
for (i in 1:length(fish_photos)){
  img = readJPEG(paste("/Users/evan.muzzall/Desktop/MachineLearningWG/Fall2017/Sep22-images-cnn/images-cnn-R/", fish_photos[i], sep = ""))
  
  #Reshape to 64x64 pixel size and grayscale image
  img = Image(img, dim = c(64, 64), color = "grayscale")
  
  #Resizing Image to 28x28 Pixel Size
  img = Image(img, dim = c(28, 28))
  img = img@.Data
  
  #Transforming to vector
  img = as.vector(t(img))
  
  #Adding Label 
  label = 1
  
  img = c(label, img)
  
  #Appending to List
  img_data = rbind(img_data, img)
  
}

#Transforming data into matrix for input into CNN 
training_set = data.matrix(img_data)
training_set = as.data.frame(training_set)
# names(training_set)
training_set$X1 = c(c(rep(1,15), rep(0,5))) # quickly relabel class: koi (1) or not koi (0). 

set.seed(1)
#Cross Validating Results 
rows = sample(1:nrow(training_set), nrow(training_set)*.75)
rows
##  [1]  6  8 11 16  4 14 15  9 19  1  3  2 20 10  5
#Training Set
x_train = t(training_set[rows, -1])
y_train = training_set[rows, 1]
dim(x_train) = c(28,28, 1, ncol(x_train))

#Test Set
x_test = t(training_set[-rows, -1])
y_test = training_set[-rows, 1]
dim(x_test) = c(28,28, 1, ncol(x_test))

#####################################
#Building Convolutional Neural Network 
#We will use a LeNet Architecture for this example. Readers may feel free to experiment by using alternative arhcitectures 

# this example uses a sigmoid activation type

data = mx.symbol.Variable('data')

#Layer 1
convolution_l1 = mx.symbol.Convolution(data = data, kernel = c(5,5), num_filter = 20)
sigmoid_l1 = mx.symbol.Activation(data = convolution_l1, act_type = "sigmoid")
pooling_l1 = mx.symbol.Pooling(data = sigmoid_l1, pool_type = "max", kernel = c(1,1), stride = c(1,1))

#Layer 2
convolution_l2 = mx.symbol.Convolution(data = pooling_l1, kernel = c(3,3), num_filter = 10)
sigmoid_l2 = mx.symbol.Activation(data = convolution_l2, act_type = "sigmoid")
pooling_l2 = mx.symbol.Pooling(data = sigmoid_l2, pool_type = "max", kernel = c(1,1), stride = c(1,1))

#Fully Connected 1
fl = mx.symbol.Flatten(data = pooling_l2)
full_conn1 = mx.symbol.FullyConnected(data = fl, num_hidden = 500)
sigmoid_l3 = mx.symbol.Activation(data = full_conn1, act_type = "sigmoid")

#Fully Connected 2
full_conn2 = mx.symbol.FullyConnected(data = sigmoid_l3, num_hidden = 40)

#Softmax Classification Layer 
CNN = mx.symbol.SoftmaxOutput(data = full_conn2)

##################################################################################################
#Model Training and Parameter Tuning
mx.set.seed(1)
#Learning Rate Parameter
AUC = c()
learn_rate = c(0.01, 0.02, 0.03, 0.10)
CPU = mx.cpu()

for (i in 1:length(learn_rate)){
  
  cnn_model = mx.model.FeedForward.create(CNN, X = x_train, y = y_train, ctx = CPU,
                                           num.round = 50, array.batch.size = 40,
                                           learning.rate = learn_rate[i],
                                           momentum = 0.9, eval.metric = mx.metric.accuracy,
                                           epoch.end.callback = mx.callback.log.train.metric(100), optimizer = "sgd")
  #Calculating Training Accuracy
  y_h = predict(cnn_model, x_train)
  Labels = max.col(t(y_h)) - 1
  AUC = append(AUC, roc(as.factor(y_train), as.numeric(Labels))$auc[1])
  
}
## Start training with 1 devices
## [1] Train-accuracy=NaN
## [2] Train-accuracy=0
## [3] Train-accuracy=0.8
## [4] Train-accuracy=0.8
## [5] Train-accuracy=0.8
## [6] Train-accuracy=0.8
## [7] Train-accuracy=0.8
## [8] Train-accuracy=0.8
## [9] Train-accuracy=0.8
## [10] Train-accuracy=0.8
## [11] Train-accuracy=0.8
## [12] Train-accuracy=0.8
## [13] Train-accuracy=0.2
## [14] Train-accuracy=0.2
## [15] Train-accuracy=0.8
## [16] Train-accuracy=0.8
## [17] Train-accuracy=0.8
## [18] Train-accuracy=0.8
## [19] Train-accuracy=0.8
## [20] Train-accuracy=0.8
## [21] Train-accuracy=0.8
## [22] Train-accuracy=0.8
## [23] Train-accuracy=0.8
## [24] Train-accuracy=0.8
## [25] Train-accuracy=0.8
## [26] Train-accuracy=0.8
## [27] Train-accuracy=0.8
## [28] Train-accuracy=0.8
## [29] Train-accuracy=0.8
## [30] Train-accuracy=0.8
## [31] Train-accuracy=0.8
## [32] Train-accuracy=0.8
## [33] Train-accuracy=0.8
## [34] Train-accuracy=0.8
## [35] Train-accuracy=0.8
## [36] Train-accuracy=0.8
## [37] Train-accuracy=0.8
## [38] Train-accuracy=0.8
## [39] Train-accuracy=0.8
## [40] Train-accuracy=0.8
## [41] Train-accuracy=0.8
## [42] Train-accuracy=0.8
## [43] Train-accuracy=0.8
## [44] Train-accuracy=0.8
## [45] Train-accuracy=0.8
## [46] Train-accuracy=0.8
## [47] Train-accuracy=0.8
## [48] Train-accuracy=0.8
## [49] Train-accuracy=0.8
## [50] Train-accuracy=0.8
## Start training with 1 devices
## [1] Train-accuracy=NaN
## [2] Train-accuracy=0
## [3] Train-accuracy=0.8
## [4] Train-accuracy=0.8
## [5] Train-accuracy=0.8
## [6] Train-accuracy=0.8
## [7] Train-accuracy=0.8
## [8] Train-accuracy=0.8
## [9] Train-accuracy=0.8
## [10] Train-accuracy=0.2
## [11] Train-accuracy=0.2
## [12] Train-accuracy=0.8
## [13] Train-accuracy=0.8
## [14] Train-accuracy=0.8
## [15] Train-accuracy=0.8
## [16] Train-accuracy=0.8
## [17] Train-accuracy=0.8
## [18] Train-accuracy=0.8
## [19] Train-accuracy=0.8
## [20] Train-accuracy=0.8
## [21] Train-accuracy=0.8
## [22] Train-accuracy=0.8
## [23] Train-accuracy=0.8
## [24] Train-accuracy=0.8
## [25] Train-accuracy=0.8
## [26] Train-accuracy=0.8
## [27] Train-accuracy=0.8
## [28] Train-accuracy=0.8
## [29] Train-accuracy=0.8
## [30] Train-accuracy=0.8
## [31] Train-accuracy=0.8
## [32] Train-accuracy=0.8
## [33] Train-accuracy=0.8
## [34] Train-accuracy=0.8
## [35] Train-accuracy=0.8
## [36] Train-accuracy=0.8
## [37] Train-accuracy=0.8
## [38] Train-accuracy=0.8
## [39] Train-accuracy=0.8
## [40] Train-accuracy=0.8
## [41] Train-accuracy=0.8
## [42] Train-accuracy=0.8
## [43] Train-accuracy=0.8
## [44] Train-accuracy=0.8
## [45] Train-accuracy=0.8
## [46] Train-accuracy=0.8
## [47] Train-accuracy=0.8
## [48] Train-accuracy=0.8
## [49] Train-accuracy=0.8
## [50] Train-accuracy=0.8
## Start training with 1 devices
## [1] Train-accuracy=NaN
## [2] Train-accuracy=0
## [3] Train-accuracy=0.8
## [4] Train-accuracy=0.8
## [5] Train-accuracy=0.8
## [6] Train-accuracy=0.8
## [7] Train-accuracy=0.8
## [8] Train-accuracy=0.8
## [9] Train-accuracy=0.2
## [10] Train-accuracy=0.2
## [11] Train-accuracy=0.8
## [12] Train-accuracy=0.8
## [13] Train-accuracy=0.8
## [14] Train-accuracy=0.8
## [15] Train-accuracy=0.8
## [16] Train-accuracy=0.8
## [17] Train-accuracy=0.8
## [18] Train-accuracy=0.8
## [19] Train-accuracy=0.8
## [20] Train-accuracy=0.8
## [21] Train-accuracy=0.8
## [22] Train-accuracy=0.8
## [23] Train-accuracy=0.8
## [24] Train-accuracy=0.8
## [25] Train-accuracy=0.8
## [26] Train-accuracy=0.8
## [27] Train-accuracy=0.8
## [28] Train-accuracy=0.8
## [29] Train-accuracy=0.8
## [30] Train-accuracy=0.8
## [31] Train-accuracy=0.8
## [32] Train-accuracy=0.8
## [33] Train-accuracy=0.8
## [34] Train-accuracy=0.8
## [35] Train-accuracy=0.8
## [36] Train-accuracy=0.8
## [37] Train-accuracy=0.8
## [38] Train-accuracy=0.8
## [39] Train-accuracy=0.8
## [40] Train-accuracy=0.8
## [41] Train-accuracy=0.8
## [42] Train-accuracy=0.8
## [43] Train-accuracy=0.8
## [44] Train-accuracy=0.8
## [45] Train-accuracy=0.8
## [46] Train-accuracy=0.8
## [47] Train-accuracy=0.8
## [48] Train-accuracy=0.8
## [49] Train-accuracy=0.8
## [50] Train-accuracy=0.8
## Start training with 1 devices
## [1] Train-accuracy=NaN
## [2] Train-accuracy=0
## [3] Train-accuracy=0.8
## [4] Train-accuracy=0.8
## [5] Train-accuracy=0.8
## [6] Train-accuracy=0.2
## [7] Train-accuracy=0.2
## [8] Train-accuracy=0.8
## [9] Train-accuracy=0.8
## [10] Train-accuracy=0.8
## [11] Train-accuracy=0.8
## [12] Train-accuracy=0.8
## [13] Train-accuracy=0.8
## [14] Train-accuracy=0.8
## [15] Train-accuracy=0.8
## [16] Train-accuracy=0.8
## [17] Train-accuracy=0.8
## [18] Train-accuracy=0.8
## [19] Train-accuracy=0.8
## [20] Train-accuracy=0.8
## [21] Train-accuracy=0.8
## [22] Train-accuracy=0.8
## [23] Train-accuracy=0.8
## [24] Train-accuracy=0.8
## [25] Train-accuracy=0.8
## [26] Train-accuracy=0.8
## [27] Train-accuracy=0.8
## [28] Train-accuracy=0.8
## [29] Train-accuracy=0.8
## [30] Train-accuracy=0.8
## [31] Train-accuracy=0.8
## [32] Train-accuracy=0.8
## [33] Train-accuracy=0.8
## [34] Train-accuracy=0.8
## [35] Train-accuracy=0.8
## [36] Train-accuracy=0.933333333333333
## [37] Train-accuracy=0.933333333333333
## [38] Train-accuracy=0.933333333333333
## [39] Train-accuracy=0.933333333333333
## [40] Train-accuracy=0.933333333333333
## [41] Train-accuracy=0.933333333333333
## [42] Train-accuracy=0.933333333333333
## [43] Train-accuracy=0.933333333333333
## [44] Train-accuracy=0.933333333333333
## [45] Train-accuracy=0.933333333333333
## [46] Train-accuracy=0.933333333333333
## [47] Train-accuracy=0.933333333333333
## [48] Train-accuracy=0.933333333333333
## [49] Train-accuracy=0.933333333333333
## [50] Train-accuracy=0.933333333333333
# learn about momentum and learning rate adaptation here: 
# https://www.willamette.edu/~gorr/classes/cs449/momrate.html

#Plotting AUC
plot(learn_rate, AUC, main = "AUC for CNN \n Training Learning Rate Parameter", xlab = "learning rate", 
     ylab = "AUC Score", type = "l", col = "cadetblue")

#Momentum Parameter
mx.set.seed(1)
AUC1 = c()
mom = c(0.5, 0.9, 1.5)
CPU = mx.cpu()

for (i in 1:length(mom)){
  
  cnn_model = mx.model.FeedForward.create(CNN, X = x_train, y = y_train, ctx = CPU,
                                           num.round = 50, array.batch.size = 40,
                                           learning.rate = 0.04,
                                           momentum = mom[i], eval.metric = mx.metric.accuracy,
                                           epoch.end.callback = mx.callback.log.train.metric(100), optimizer = "sgd")
  #Calculating Training Accuracy
  y_h = predict(cnn_model, x_train)
  Labels = max.col(t(y_h)) - 1
  AUC1 = append(AUC1, roc(as.factor(y_train), as.numeric(Labels))$auc[1])
  
}
## Start training with 1 devices
## [1] Train-accuracy=NaN
## [2] Train-accuracy=0
## [3] Train-accuracy=0.8
## [4] Train-accuracy=0.8
## [5] Train-accuracy=0.8
## [6] Train-accuracy=0.8
## [7] Train-accuracy=0.8
## [8] Train-accuracy=0.8
## [9] Train-accuracy=0.8
## [10] Train-accuracy=0.8
## [11] Train-accuracy=0.8
## [12] Train-accuracy=0.8
## [13] Train-accuracy=0.8
## [14] Train-accuracy=0.8
## [15] Train-accuracy=0.8
## [16] Train-accuracy=0.8
## [17] Train-accuracy=0.8
## [18] Train-accuracy=0.8
## [19] Train-accuracy=0.8
## [20] Train-accuracy=0.8
## [21] Train-accuracy=0.8
## [22] Train-accuracy=0.8
## [23] Train-accuracy=0.8
## [24] Train-accuracy=0.8
## [25] Train-accuracy=0.8
## [26] Train-accuracy=0.8
## [27] Train-accuracy=0.8
## [28] Train-accuracy=0.8
## [29] Train-accuracy=0.8
## [30] Train-accuracy=0.8
## [31] Train-accuracy=0.8
## [32] Train-accuracy=0.8
## [33] Train-accuracy=0.8
## [34] Train-accuracy=0.8
## [35] Train-accuracy=0.8
## [36] Train-accuracy=0.8
## [37] Train-accuracy=0.8
## [38] Train-accuracy=0.8
## [39] Train-accuracy=0.8
## [40] Train-accuracy=0.8
## [41] Train-accuracy=0.8
## [42] Train-accuracy=0.8
## [43] Train-accuracy=0.8
## [44] Train-accuracy=0.8
## [45] Train-accuracy=0.8
## [46] Train-accuracy=0.8
## [47] Train-accuracy=0.8
## [48] Train-accuracy=0.8
## [49] Train-accuracy=0.8
## [50] Train-accuracy=0.8
## Start training with 1 devices
## [1] Train-accuracy=NaN
## [2] Train-accuracy=0
## [3] Train-accuracy=0.8
## [4] Train-accuracy=0.8
## [5] Train-accuracy=0.8
## [6] Train-accuracy=0.8
## [7] Train-accuracy=0.8
## [8] Train-accuracy=0.2
## [9] Train-accuracy=0.8
## [10] Train-accuracy=0.8
## [11] Train-accuracy=0.8
## [12] Train-accuracy=0.8
## [13] Train-accuracy=0.8
## [14] Train-accuracy=0.8
## [15] Train-accuracy=0.8
## [16] Train-accuracy=0.8
## [17] Train-accuracy=0.8
## [18] Train-accuracy=0.8
## [19] Train-accuracy=0.8
## [20] Train-accuracy=0.8
## [21] Train-accuracy=0.8
## [22] Train-accuracy=0.8
## [23] Train-accuracy=0.8
## [24] Train-accuracy=0.8
## [25] Train-accuracy=0.8
## [26] Train-accuracy=0.8
## [27] Train-accuracy=0.8
## [28] Train-accuracy=0.8
## [29] Train-accuracy=0.8
## [30] Train-accuracy=0.8
## [31] Train-accuracy=0.8
## [32] Train-accuracy=0.8
## [33] Train-accuracy=0.8
## [34] Train-accuracy=0.8
## [35] Train-accuracy=0.8
## [36] Train-accuracy=0.8
## [37] Train-accuracy=0.8
## [38] Train-accuracy=0.8
## [39] Train-accuracy=0.8
## [40] Train-accuracy=0.8
## [41] Train-accuracy=0.8
## [42] Train-accuracy=0.8
## [43] Train-accuracy=0.8
## [44] Train-accuracy=0.8
## [45] Train-accuracy=0.8
## [46] Train-accuracy=0.8
## [47] Train-accuracy=0.8
## [48] Train-accuracy=0.8
## [49] Train-accuracy=0.8
## [50] Train-accuracy=0.8
## Start training with 1 devices
## [1] Train-accuracy=NaN
## [2] Train-accuracy=0
## [3] Train-accuracy=0.8
## [4] Train-accuracy=0.8
## [5] Train-accuracy=0.8
## [6] Train-accuracy=0.8
## [7] Train-accuracy=0.8
## [8] Train-accuracy=0.8
## [9] Train-accuracy=0.8
## [10] Train-accuracy=0.8
## [11] Train-accuracy=0.8
## [12] Train-accuracy=0.8
## [13] Train-accuracy=0.8
## [14] Train-accuracy=0.2
## [15] Train-accuracy=0.2
## [16] Train-accuracy=0.2
## [17] Train-accuracy=0.2
## [18] Train-accuracy=0.2
## [19] Train-accuracy=0.8
## [20] Train-accuracy=0.8
## [21] Train-accuracy=0.8
## [22] Train-accuracy=0.8
## [23] Train-accuracy=0.8
## [24] Train-accuracy=0.8
## [25] Train-accuracy=0.8
## [26] Train-accuracy=0.8
## [27] Train-accuracy=0.8
## [28] Train-accuracy=0.8
## [29] Train-accuracy=0.8
## [30] Train-accuracy=0.8
## [31] Train-accuracy=0.8
## [32] Train-accuracy=0.8
## [33] Train-accuracy=0.8
## [34] Train-accuracy=0.8
## [35] Train-accuracy=0.8
## [36] Train-accuracy=0.8
## [37] Train-accuracy=0.8
## [38] Train-accuracy=0.8
## [39] Train-accuracy=0.8
## [40] Train-accuracy=0.8
## [41] Train-accuracy=0.8
## [42] Train-accuracy=0.8
## [43] Train-accuracy=0.8
## [44] Train-accuracy=0.8
## [45] Train-accuracy=0.8
## [46] Train-accuracy=0.8
## [47] Train-accuracy=0.8
## [48] Train-accuracy=0.8
## [49] Train-accuracy=0.8
## [50] Train-accuracy=0.8
#Plotting AUC
plot(mom, AUC1, main = "AUC for CNN \n Training Momentum Parameter", xlab = "momentum", 
     ylab = "AUC Score", type = "l", col = "cadetblue")

##################################################################################################
#Fitted Model Training
cnn_model = mx.model.FeedForward.create(CNN, X = x_train, y = y_train, ctx = CPU,
                                         num.round = 150, array.batch.size = 40,
                                         learning.rate = 0.04, momentum = 0.9, eval.metric = mx.metric.accuracy,
                                         optimizer = "sgd")
## Start training with 1 devices
## [1] Train-accuracy=NaN
## [2] Train-accuracy=0
## [3] Train-accuracy=0.8
## [4] Train-accuracy=0.8
## [5] Train-accuracy=0.8
## [6] Train-accuracy=0.8
## [7] Train-accuracy=0.8
## [8] Train-accuracy=0.2
## [9] Train-accuracy=0.8
## [10] Train-accuracy=0.8
## [11] Train-accuracy=0.8
## [12] Train-accuracy=0.8
## [13] Train-accuracy=0.8
## [14] Train-accuracy=0.8
## [15] Train-accuracy=0.8
## [16] Train-accuracy=0.8
## [17] Train-accuracy=0.8
## [18] Train-accuracy=0.8
## [19] Train-accuracy=0.8
## [20] Train-accuracy=0.8
## [21] Train-accuracy=0.8
## [22] Train-accuracy=0.8
## [23] Train-accuracy=0.8
## [24] Train-accuracy=0.8
## [25] Train-accuracy=0.8
## [26] Train-accuracy=0.8
## [27] Train-accuracy=0.8
## [28] Train-accuracy=0.8
## [29] Train-accuracy=0.8
## [30] Train-accuracy=0.8
## [31] Train-accuracy=0.8
## [32] Train-accuracy=0.8
## [33] Train-accuracy=0.8
## [34] Train-accuracy=0.8
## [35] Train-accuracy=0.8
## [36] Train-accuracy=0.8
## [37] Train-accuracy=0.8
## [38] Train-accuracy=0.8
## [39] Train-accuracy=0.8
## [40] Train-accuracy=0.8
## [41] Train-accuracy=0.8
## [42] Train-accuracy=0.8
## [43] Train-accuracy=0.8
## [44] Train-accuracy=0.8
## [45] Train-accuracy=0.8
## [46] Train-accuracy=0.8
## [47] Train-accuracy=0.8
## [48] Train-accuracy=0.8
## [49] Train-accuracy=0.8
## [50] Train-accuracy=0.8
## [51] Train-accuracy=0.8
## [52] Train-accuracy=0.8
## [53] Train-accuracy=0.8
## [54] Train-accuracy=0.8
## [55] Train-accuracy=0.8
## [56] Train-accuracy=0.8
## [57] Train-accuracy=0.8
## [58] Train-accuracy=0.8
## [59] Train-accuracy=0.8
## [60] Train-accuracy=0.8
## [61] Train-accuracy=0.8
## [62] Train-accuracy=0.8
## [63] Train-accuracy=0.8
## [64] Train-accuracy=0.8
## [65] Train-accuracy=0.8
## [66] Train-accuracy=0.8
## [67] Train-accuracy=0.8
## [68] Train-accuracy=0.8
## [69] Train-accuracy=0.8
## [70] Train-accuracy=0.8
## [71] Train-accuracy=0.8
## [72] Train-accuracy=0.8
## [73] Train-accuracy=0.8
## [74] Train-accuracy=0.8
## [75] Train-accuracy=0.8
## [76] Train-accuracy=0.8
## [77] Train-accuracy=0.8
## [78] Train-accuracy=0.8
## [79] Train-accuracy=0.8
## [80] Train-accuracy=0.8
## [81] Train-accuracy=0.8
## [82] Train-accuracy=0.8
## [83] Train-accuracy=0.8
## [84] Train-accuracy=0.8
## [85] Train-accuracy=0.8
## [86] Train-accuracy=0.8
## [87] Train-accuracy=0.8
## [88] Train-accuracy=0.8
## [89] Train-accuracy=0.8
## [90] Train-accuracy=0.8
## [91] Train-accuracy=0.8
## [92] Train-accuracy=0.8
## [93] Train-accuracy=0.8
## [94] Train-accuracy=0.8
## [95] Train-accuracy=0.8
## [96] Train-accuracy=0.8
## [97] Train-accuracy=0.8
## [98] Train-accuracy=0.8
## [99] Train-accuracy=0.8
## [100] Train-accuracy=0.8
## [101] Train-accuracy=0.8
## [102] Train-accuracy=0.8
## [103] Train-accuracy=0.8
## [104] Train-accuracy=0.8
## [105] Train-accuracy=0.8
## [106] Train-accuracy=0.8
## [107] Train-accuracy=0.8
## [108] Train-accuracy=0.8
## [109] Train-accuracy=0.8
## [110] Train-accuracy=0.8
## [111] Train-accuracy=0.8
## [112] Train-accuracy=0.8
## [113] Train-accuracy=0.8
## [114] Train-accuracy=0.8
## [115] Train-accuracy=0.8
## [116] Train-accuracy=0.8
## [117] Train-accuracy=0.8
## [118] Train-accuracy=0.8
## [119] Train-accuracy=0.8
## [120] Train-accuracy=0.8
## [121] Train-accuracy=0.8
## [122] Train-accuracy=0.8
## [123] Train-accuracy=0.8
## [124] Train-accuracy=0.8
## [125] Train-accuracy=0.8
## [126] Train-accuracy=0.8
## [127] Train-accuracy=0.8
## [128] Train-accuracy=0.8
## [129] Train-accuracy=0.8
## [130] Train-accuracy=0.8
## [131] Train-accuracy=0.8
## [132] Train-accuracy=0.8
## [133] Train-accuracy=0.8
## [134] Train-accuracy=0.8
## [135] Train-accuracy=0.8
## [136] Train-accuracy=0.8
## [137] Train-accuracy=0.8
## [138] Train-accuracy=0.8
## [139] Train-accuracy=0.8
## [140] Train-accuracy=0.8
## [141] Train-accuracy=0.8
## [142] Train-accuracy=0.8
## [143] Train-accuracy=0.8
## [144] Train-accuracy=0.8
## [145] Train-accuracy=0.8
## [146] Train-accuracy=0.8
## [147] Train-accuracy=0.8
## [148] Train-accuracy=0.8
## [149] Train-accuracy=0.8
## [150] Train-accuracy=0.8
#Calculating Training Set Accuracy
y_h = predict(cnn_model, x_train)
Labels = max.col(t(y_h)) - 1
roc(as.factor(y_train), as.numeric(Labels))
## 
## Call:
## roc.default(response = as.factor(y_train), predictor = as.numeric(Labels))
## 
## Data: as.numeric(Labels) in 3 controls (as.factor(y_train) 0) < 12 cases (as.factor(y_train) 1).
## Area under the curve: 0.5
curve = roc(as.factor(y_train), as.numeric(Labels))

#Plotting Results
plot(curve, main = "ROC Curve for Convolutional Neural Network \n Train Set")

#Calculating Test Set Accuracy
y_h = predict(cnn_model, x_test)
Labels = max.col(t(y_h)) - 1
roc(as.factor(y_test), as.numeric(Labels))
## 
## Call:
## roc.default(response = as.factor(y_test), predictor = as.numeric(Labels))
## 
## Data: as.numeric(Labels) in 2 controls (as.factor(y_test) 0) < 3 cases (as.factor(y_test) 1).
## Area under the curve: 0.5
curve1 = roc(as.factor(y_test), as.numeric(Labels))

#Plotting Results
plot(curve1, main = "ROC Curve for Convolutional Neural Network \n Test Set")